import axios from 'axios'
import store from '@/store/index'
import { removeToken } from './auth'
import router from '@/router'
// 基地址
export const baseURL = process.env.VUE_APP_BASE_API
// 创建一个独立实例
const instance = axios.create({
  baseURL: baseURL
})
// 添加响应拦截器
instance.interceptors.response.use(
  (res) => {
    // res表示axios包装后的数据
    return res.data
  },
  (err) => {
    // 处理token失效的问题
    console.dir(err)
    if (err.response.status === 401 && err.response.data.code === 10002) {
      // token已经失效；删除token；删除用户信息；跳转到登录页面
      removeToken()
      store.commit('user/SET_TOKEN', '')
      store.commit('user/clearInfo')
      router.push('/login')
    }
    return Promise.reject(err)
  }
)

// 请求拦截器
instance.interceptors.request.use(
  (config) => {
    const token = store.state.user.token
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  (err) => {
    return Promise.reject(err)
  }
)
// 封装通用的接口调用函数
// 按照这种方式封装时，无论何种请求方式，参数都用data传递，更加方便
export default (options) => {
  let key = null
  if (options.method) {
    // method属性是存在的
    key = options.method === 'get' ? 'params' : 'data'
  } else {
    key = 'params'
  }
  return instance({
    method: options.method || 'get',
    url: options.url,
    // ES6规则：对象的key可以是动态的变量
    [key]: options.data
  })
}
